package Q17_21_Volume_of_Histogram;
public class QuestionA {
public static int findIndexOfMax(int[] histogram, int start, int end) {
int indexOfMax = start;
for (int i = start + 1; i <= end; i++) {
if (histogram[i] > histogram[indexOfMax]) {
indexOfMax = i;
}
}
return indexOfMax;
}
public static int borderedVolume(int[] histogram, int start, int end) {
if (start >= end) return 0;
int min = Math.min(histogram[start], histogram[end]);
int sum = 0;
for (int i = start + 1; i < end; i++) {
sum += min - histogram[i];
}
return sum;
}
public static int subgraphVolume(int[] histogram, int start, int end, boolean isLeft) {
if (start >= end) return 0;
int sum = 0;
if (isLeft) {
int max = findIndexOfMax(histogram, start, end - 1);
sum += borderedVolume(histogram, max, end);
sum += subgraphVolume(histogram, start, max, isLeft);
} else {
int max = findIndexOfMax(histogram, start + 1, end);
sum += borderedVolume(histogram, start, max);
sum += subgraphVolume(histogram, max, end, isLeft);
}
return sum;
}
public static int computeHistogramVolume(int[] histogram) {
int start = 0;
int end = histogram.length - 1;
int max = findIndexOfMax(histogram, start, end);
int leftVolume = subgraphVolume(histogram, start, max, true);
int rightVolume = subgraphVolume(histogram, max, end, false);
return leftVolume + rightVolume;
}
public static void main(String[] args) {
int[] histogram = {0, 0, 4, 0, 0, 6, 0, 0, 3, 0, 8, 0, 2, 0, 5, 2, 0, 3, 0, 0};
int result = computeHistogramVolume(histogram);
System.out.println(result);
}
}